package cn.stylefeng.guns.sys.modular.system.service;

import cn.stylefeng.guns.base.pojo.page.LayuiPageInfo;
import cn.stylefeng.guns.sys.modular.system.entity.AttendEmployeeMonth;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendAuditDdSupervisorParam;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendAuditManagerSetParam;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendEmployeeMonthParam;
import cn.stylefeng.guns.sys.modular.system.model.result.AttendAuditManagerSetResult;
import cn.stylefeng.guns.sys.modular.system.model.result.AttendEmployeeMonthAddValidationResult;
import cn.stylefeng.guns.sys.modular.system.model.result.AttendEmployeeMonthResult;
import cn.stylefeng.guns.sys.modular.system.model.params.AttendAuditBtyArchivesParam;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 出勤_月度员工档案信息表 服务类
 * </p>
 *
 * @author wjk
 * @since 2021-09-14
 */
public interface AttendEmployeeMonthService extends IService<AttendEmployeeMonth> {

    /**
     * 新增
     *
     * @author wjk
     * @Date 2021-09-14
     */
    void add(AttendEmployeeMonthParam param);

    /**
     * 删除
     *
     * @author wjk
     * @Date 2021-09-14
     */
    void delete(AttendEmployeeMonthParam param);

    /**
     * 更新
     *
     * @author wjk
     * @Date 2021-09-14
     */
    void update(AttendEmployeeMonthParam param);

    /**
     * 查询单条数据，Specification模式
     *
     * @author wjk
     * @Date 2021-09-14
     */
    AttendEmployeeMonthResult findBySpec(AttendEmployeeMonthParam param);

    /**
     * 查询列表，Specification模式
     *
     * @author wjk
     * @Date 2021-09-14
     */
    List<AttendEmployeeMonthResult> findListBySpec(AttendEmployeeMonthParam param);

    /**
     * 查询分页数据，Specification模式
     *
     * @author wjk
     * @Date 2021-09-14
     */
     LayuiPageInfo findPageBySpec(AttendEmployeeMonthParam param);
    /**
     * mysql的批量插入方式，oracle不支持。
     * AttendEmployeeMonth批量增加月度员工考勤表
     * @param list
     */
    int simpleSqlInsertBatch(List<AttendEmployeeMonth> list);
    /**
     * 删除 当月的数据
     *
     * @author wjk
     * @param synchronousMonth 例子：202109
     * @Date 2021-09-15
     */
    boolean deleteList(String synchronousMonth);

//    /**
//     * 根据店长的手机号码，返回店长下的所有的人员（当月）档案的列表；
//     * @author wjk
//     * @Date 2021-09-15
//     */
//    List<AttendEmployeeMonth> getEmployeeListMonthByDzPhone(String account);
    /**
     * 删除当月，当店的月度考勤数据；
     * @author wjk
     * @Date 2021-09-16
     */
    boolean deleteList(String synchronousMonth, String dm);

     /**
     * （店长考勤修改页面）根据店长的手机号码，返回该店的店长，所有的审核信息；
     * @author wjk
     * @Date 2021-09-17
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByManagerSetParam(AttendAuditManagerSetParam param);

    /**
     * （店长考勤修改页面）编辑员工的出勤天数，公休天数，应发工资数，是否在职，是否发工资信息，以及备注1
     *
     *
     * @author wjk
     * @Date 2021-09-17
     */
    boolean updateAttendEmployeeMonthById(AttendEmployeeMonthParam attendEmployeeMonthParam,String account);

    /**
     * （店长考勤修改页面+新增员工信息） 增加员工信息的验证消息
     * @param attendEmployeeMonthParam
     * @param account
     * @return
     */
    AttendEmployeeMonthAddValidationResult addAttendEmployeeMonthValidation(AttendEmployeeMonthParam attendEmployeeMonthParam, String account);

    /**
     * （店长考勤修改页面+新增员工信息） 根据编号，和同步状态，同步单个考勤信息
     * @param account
     * @return
     */
    AttendEmployeeMonth synchronousOneAttendEmployeeMonthByBh(String account,AttendEmployeeMonthAddValidationResult attendEmployeeMonthAddValidationResult);


    /**
     * （店长考勤修改页面+新增员工信息） 增加员工信息
     *
     *
     * @author wjk
     * @Date 2021-09-17
     */
    boolean addAttendEmployeeMonth(AttendEmployeeMonthParam attendEmployeeMonthParam,String account);

    /**
     * （店长考勤修改页面+修改新增员工信息） 修改员工信息
     *
     *
     * @author wjk
     * @Date 2021-09-17
     */
    boolean updateAttendEmployeeMonth(AttendEmployeeMonthParam attendEmployeeMonthParam);

    /**
     * （店长考勤修改页面+员工调店） 根据店长手机号，和员工id将员工调入店长下的店
     *
     *
     * @author wjk
     * @Date 2021-09-17
     */
    String setEmployeeToShop(String account, AttendAuditBtyArchivesParam attendAuditBtyArchivesParam);


    /**
     * （督导审核页面）根据督导的手机号码，返回该店的督导所有的审核信息；
     * @author wjk
     * @Date 2021-09-18
     */

    List<AttendAuditManagerSetResult> getEmployeeListMonthByDdSupervisorParam(AttendAuditDdSupervisorParam param);

    /**
     * （督导审核页面）更新对新员工的状态(synchronous_status:(2 or 4) to 3)
     *  将店长提交状态或者督导驳回的新员工状态，更新到督导审核通过状态
     * @param param
     * @param account
     * @return
     */
    int newEmployeeApprove(List<AttendAuditManagerSetResult> param, String account);

    /**
     * （督导审核页面）更新对新员工的状态(synchronous_status: 2 to 4)
     *  将店长提交状态,更新到督导审核驳回状态
     * @param param
     * @param account
     * @return
     */
    int newEmployeeBack(List<AttendAuditManagerSetResult> param, String account);

    /**
     * （督导审核页面）根据督导选择店，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数）；
     * @author wjk
     * @Date 2021-09-18
     */
    Map<String,String> getShouldPayByDdSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * （店长考勤修改页面+新增员工信息）删除员工信息，根据店长的电话 和 员工的id
     *
     *
     * @author wjk
     * @Date 2021-09-18
     */
    boolean deleteAttendEmployeeMonth(String account, String id);

    /**
     * （店长考勤页面）根据店名，月份，返回计算的（待审核，加上已审核通过的人员的应发工资总数，和人员总数）；
     * @author wjk
     * @Date 2021-09-22
     */
    Map<String,String> getShouldPayByDzInfo(AttendAuditDdSupervisorParam param);

    /**
     * 根据列表查询这些员工已经做过本月考勤记录列表
     * @author wjk
     * @Date 2021-09-23
     */
    List<AttendEmployeeMonth> getEmployeeListByAuditBtyArchiveList(List<AttendEmployeeMonth> attendEmployeeMonthList,String attendMonth);

    /**
     * （店长考勤页面）根据员工信息，计算员工考勤的月份的信息
     * @author wjk
     * @Date 2021-09-28
     */
    AttendAuditManagerSetResult calculateEmployeeSalary(AttendAuditManagerSetResult attendAuditManagerSetResult, String account);
    /**
     * 传入具体日期 ，返回具体日期增加或者减少月数，传出日期
     * @author wjk
     * @Date 2021-09-27
     */
    Date calculateMonth(Date date, int month);
    /**
     * （督导审核页面）根据督导的手机号码，和考核的月份返回该店的督导所有的店名；
     * @author wjk
     * @Date 2021-10-08
     */
    String[] getAttendAuditShowListByDdSupervisor(AttendAuditDdSupervisorParam param);

    /**
     * （督导审核页面）根据督导的手机号码，和考核的月份返回该店的督导所有的店名；
     * @author wjk
     * @Date 2021-10-14
     */
    List<Map<String,String>> getAttendAuditShowListByDdSupervisorList(AttendAuditDdSupervisorParam param);

    /**
     * 修改若有新员工，则更改新员工状态,为提交状态
     * @param aaId
     * @return
     */
    int newEmployeeSubmitAudit(String aaId);
    /**
     * （店长考勤修改页面）根据店长的手机号码，返回店长是应该跳转考勤页还是应该创建考勤页（若未创建考勤，状态为0，若已经创建了考勤，则状态为1）；
     * @author wjk
     * @Date 2021-10-12
     */
    Map<String,String> getPageByDzPhone(String account, String attendMonth);
    /**
     * （店长考勤修改页面）编辑当员工工资为0或者空的时候允许编辑员工的工资
     *
     *
     * @author wjk
     * @Date 2021-10-18
     */
    boolean updateAttendEmployeeMonthForGzById(AttendEmployeeMonthParam attendEmployeeMonthParam);

    /**
     * （运营经理页面）根据运营经理的手机号码，和考核的月份返回该店的运营经理所有的店名；
     * @author wjk
     * @Date 2021-10-19
     */
    List<Map<String, String>> getAttendAuditShowListByYyjl(AttendAuditDdSupervisorParam param);

    /**
     * （运营经理页面）根据运营经理的手机号码，和考核的月份返回该店的运营经理所有的店名；
     * @author wjk
     * @Date 2021-11-19
     */
    LayuiPageInfo getAttendAuditShowListByYyjlLayuiPage(AttendAuditDdSupervisorParam param);

    /**
     * （营运经理页面）根据督导选择店，月份，返回计算的（已审核通过的人员的应发工资总数）；
     * @param param
     * @return
     */
    Map<String,String> getShouldPayByYyjl(AttendAuditDdSupervisorParam param);
    /**
     * （营运经理审核页面）根据营运经理的手机号码，返回该店的督导所有的审核信息；
     * @author wjk
     * @Date 2021-09-19
     */
    List<AttendAuditManagerSetResult> getEmployeeListMonthByYyjlSupervisorParam(AttendAuditDdSupervisorParam param);

    /**
     * （营运经理审核页面）根据营运经理的手机号码，返回该店的督导所有的审核信息-分页；
     * @author wjk
     * @Date 2021-11-19
     */
    LayuiPageInfo getEmployeeListMonthByYyjlSupervisorParamLayuiPage(AttendAuditDdSupervisorParam param);

    /**
     * （店长考勤修改页面+重建考勤信息） 根据店长手机号，考勤的月份，重建店长当月的建考勤信息
     *
     *
     * @author wjk
     * @Date 2021-10-28
     */
    int setEmployeeListByDzPhoneRestart(AttendAuditDdSupervisorParam attendAuditDdSupervisorParam);

    /**
     * 根据对比的数据进行数据同步
     * @param attendAuditDdSupervisorParam
     * @return
     * @author wjk
     * @Date 2021-11-09
     */
    int setEmployeeListByDzPhoneRestartForContrast(AttendAuditDdSupervisorParam attendAuditDdSupervisorParam);
    /**
     * （店长考勤修改页面+重建考勤信息） 同步考勤信息前的验证
     * @param attendAuditManagerSetParam
     * @return
     */
    List<Map<String,AttendAuditManagerSetResult>> contrastEmployeeListByDzPhoneRestart(AttendAuditManagerSetParam attendAuditManagerSetParam);

    /**
     * 同步数据
     * @param param
     * @return
     */
    Map<String,String> synchronousAttendEmployeeMonthToBtyArchives(AttendAuditDdSupervisorParam param);


    /**
     * 同步数据，同步单店的数据；
     * @param param
     * @return
     */
    Map<String,String> synchronousAttendEmployeeMonthToBtyArchivesForOneShop(AttendAuditDdSupervisorParam param);



    /**
     * 根据店长手机号，判断店长手下的员工的银行卡号是否正确，并验证银行卡是否重复
     * @author wjk
     * @Date 2021-12-17
     */

    Map<String, String> getYhkStatus(AttendEmployeeMonthParam attendEmployeeMonthParam, String account);

    /**
     * 同步单人的姓名
     *
     * @author wjk
     * @Date 2021-03-09
     */
    Map<String,String> synchronousNameById(Long id);

//    /**
//     * 修改同步员工信息根据员工的id
//     * @param id
//     * @return
//     */
//    AttendEmployeeMonth updateByAuditBtyArchivesId(String id);
}
